home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_055
/
newstartups
/
twstartup.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
11KB
|
460 lines
* ==========================
* amiga.dev/programs #12, from cscheppner, 11195 chars, Tue Feb 24 17:54:45 1987
* --------------------------
* TITLE: TWstartup.asm --- Modified Astartup, opens Amiga stdio under WB
*******************************************************************
* TWStartup.asm - Amiga Startup opens stdio window on WB startup *
* using TWspec defined in application *
* example: char TWspec[] = "CON:30/30/200/150/MyProgram"; *
* ( OR char TWspec = ""; for no window ) *
* *
* Modified be C. Scheppner (08/03/86) from the following source: *
*******************************************************************
* *
* C Program Startup/Exit (Combo Version: CLI and WorkBench) *
* *
*******************************************************************
*
* Source Control:
* --------------
*
* $Header: startup.asm,v 1.1 86/08/25 12:50:07 root Exp $
*
* $Locker: root $
*
* $Log: startup.asm,v $
* Revision 1.1 86/08/25 12:50:07 root
* Initial revision
*
* Revision 33.6 86/06/12 10:34:36 neil
* changed so any version of dos is OK
*
* Revision 33.5 86/06/11 19:03:47 neil
* fixed CloseLibrary if open of dos failed
*
* Revision 33.4 86/06/09 16:48:59 neil
* now processes escapes also
*
* Revision 33.3 86/06/09 16:18:12 neil
* another checkpoint -- quoted strings now work
*
* Revision 1.1 85/11/23 13:49:01 neil
* Initial revision
*
*
************************************************************************
******* Included Files *************************************************
INCLUDE "exec/types.i"
INCLUDE "exec/alerts.i"
INCLUDE "exec/nodes.i"
INCLUDE "exec/lists.i"
INCLUDE "exec/ports.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/tasks.i"
INCLUDE "libraries/dos.i"
INCLUDE "libraries/dosextens.i"
INCLUDE "workbench/startup.i"
******* Imported *******************************************************
xlib macro
xref _LVO\1
endm
xref _AbsExecBase
xref _Input
xref _Output
xref _main ; C code entry point
xref _TWspec ; con: spec in application for WB stdio window
xlib Alert
xlib FindTask
xlib Forbid
xlib GetMsg
xlib OpenLibrary
xlib CloseLibrary
xlib ReplyMsg
xlib Wait
xlib WaitPort
xlib CurrentDir
xlib Open
xlib Close
******* Exported *******************************************************
xdef _SysBase
xdef _DOSBase
xdef _errno
xdef _stdin
xdef _stdout
xdef _stderr
xdef _exit ; standard C exit function
xdef _WBenchMsg
callsys macro
CALLLIB _LVO\1
endm
************************************************************************
*
* Standard Program Entry Point
*
************************************************************************
*
* main (argc, argv)
* int argc;
* char *argv[];
*
************************************************************************
startup: ; reference for Wack users
move.l sp,initialSP ; initial task stack pointer
move.l d0,dosCmdLen
move.l a0,dosCmdBuf
;------ get Exec's library base pointer:
move.l _AbsExecBase,a6
move.l a6,_SysBase
;------ get the address of our task
suba.l a1,a1
callsys FindTask
move.l d0,a4
;------ are we running as a son of Workbench?
tst.l pr_CLI(A4)
beq fromWorkbench
;=======================================================================
;====== CLI Startup Code ===============================================
;=======================================================================
fromCLI:
;------ attempt to open DOS library:
bsr openDOS
;------ find command name:
suba.l a0,a0
move.l pr_CLI(a4),d0
lsl.l #2,d0 ; bcpl pointer conversion
move.l cli_CommandName(a0,d0.l),d0
lsl.l #2,d0 ; bcpl pointer conversion
;------ create buffer and array:
movem.l a2/a3,-(sp)
lea argvBuffer,a2
lea argvArray,a3
;------ fetch command name:
move.l d0,a0
moveq.l #0,d0
move.b (a0)+,d0 ; size of command name
clr.b 0(a0,d0.l) ; terminate the string
move.l a0,(a3)+
;------ collect parameters:
move.l dosCmdLen,d0
move.l dosCmdBuf,a0
;------ null terminate the string, eat trailing garbage
lea 0(a0,d0.l),a1
stripjunk:
cmp.b #' ',-(a1)
;-- jimm: 8/25/86: per kodiak's recommendation
; bls.s stripjunk
dbhi D0,stripjunk
clr.b 1(a1)
newarg:
;------ skip spaces
move.b (a0)+,d1
beq.s parmExit
cmp.b #' ',d1
beq.s newarg
cmp.b #9,d1 ; tab
beq.s newarg
;------ push address of the next parameter
move.l a2,(a3)+
;------ process quotes
cmp.b #'"',d1
beq.s doquote
;------ copy the parameter in
move.b d1,(a2)+
nextchar:
;------ null termination check
move.b (a0)+,d1
beq.s parmExit
cmp.b #' ',d1
beq.s endarg
move.b d1,(a2)+
bra.s nextchar
endarg:
clr.b (a2)+
bra.s newarg
doquote:
;------ process quoted strings
move.b (a0)+,d1
beq.s parmExit
cmp.b #'"',d1
beq.s endarg
;------ '*' is the BCPL escape character
cmp.b #'*',d1
bne.s addquotechar
move.b (a0)+,d1
cmp.b #'N',d1
beq.s 1$
cmp.b #'n',d1
bne.s 2$
1$:
;------ got a *N -- turn into a newline
moveq #10,d1
bra.s addquotechar
2$:
cmp.b #'E',d1
beq.s 3$
cmp.b #'e',d1
bne.s addquotechar
3$:
;------ got a *E -- turn into a escape
moveq #27,d1
addquotechar:
move.b d1,(a2)+
bra.s doquote
parmExit:
;------ all done -- null terminate the baby
clr.b (a2)
clr.l (a3)
;------ compute the # of arguments
move.l #dosCmdBuf,d0
sub.l a3,d0
not.l d0
lsr.l #2,d0
movem.l (sp)+,a2/a3
pea argvArray
move.l d0,-(sp)
*
* The above code relies on the end of line containing a control
* character of any type, i.e. a valid character must not be the
* last. This fact is ensured by DOS.
*
;------ get standard input handle:
jsr _Input
move.l d0,_stdin
;------ get standard output handle:
jsr _Output
move.l d0,_stdout
move.l d0,_stderr
;------ call C main entry point
jsr _main
;------ return success code:
moveq.l #0,D0
move.l initialSP,sp ; restore stack ptr
rts
;=======================================================================
;====== Workbench Startup Code =========================================
;=======================================================================
fromWorkbench:
;------ open the DOS library:
bsr openDOS
;------ we are now set up. wait for a message from our starter
bsr waitmsg
;------ save the message so we can return it later
move.l d0,_WBenchMsg
;------ push the message on the stack for wbmain
move.l d0,-(SP)
clr.l -(SP) indicate: run from Workbench
;------ get the first argument
move.l d0,a2
move.l sm_ArgList(a2),d0
beq.s docons
;------ and set the current directory to the same directory
move.l _DOSBase,a6
move.l d0,a0
move.l wa_Lock(a0),d1
callsys CurrentDir
* ==============================================
* ============ Opens stdio window ==============
* ==============================================
docons:
lea.l _TWspec,a0
cmp.b #0,(a0) No window if TWspec is null string
beq.s domain
;------ open up the file
move.l a0,d1
move.l #MODE_OLDFILE,d2
move.l _DOSBase,a6
callsys Open
;------ set the C input and output descriptors
cmp.l #0,d0
beq.s exit2
move.l d0,_stdin
move.l d0,_stdout
move.l d0,_stderr
;------ set the console task (so Open( "*", mode ) will work
; waitmsg has left the task pointer in A4 for us
move.l d0,pr_CIS(A4)
move.l d0,pr_COS(A4)
lsl.l #2,d0
move.l d0,a0
move.l fh_Type(a0),pr_ConsoleTask(A4)
domain:
jsr _main
moveq.l #0,d0 Successful return code
bra.s exit2
************************************************************************
*
* C Program Exit Function
*
************************************************************************
*
* Warning: this function really needs to do more than this.
*
************************************************************************
_exit:
move.l 4(SP),d0 ; extract return code
exit2:
;------ Close ToolWin if we have one:
tst.l _WBenchMsg
beq.s noTW
move.l _stdin,d1
bmi.s noTW
move.l _DOSBase,a6
callsys Close
noTW:
move.l initialSP,SP ; restore stack pointer
move.l d0,-(SP) ; save return code
;------ close DOS library:
move.l _AbsExecBase,A6
move.l _DOSBase,d0
beq.s 1$
move.l d0,a1
callsys CloseLibrary
1$:
;------ if we ran from CLI, skip workbench cleanup:
tst.l _WBenchMsg
beq.s exitToDOS
;------ return the startup message to our parent
;------ we forbid so workbench can't UnLoadSeg() us
;------ before we are done:
callsys Forbid
move.l _WBenchMsg,a1
callsys ReplyMsg
;------ this rts sends us back to DOS:
exitToDOS:
move.l (SP)+,d0
rts
;-----------------------------------------------------------------------
noDOS:
ALERT (AG_OpenLib!AO_DOSLib)
moveq.l #100,d0
bra.s exit2
;-----------------------------------------------------------------------
; This routine gets the message that workbench will send to us
; called with task id in A4
waitmsg:
lea pr_MsgPort(A4),a0 * our process base
callsys WaitPort
lea pr_MsgPort(A4),a0 * our process base
callsys GetMsg
rts
;-----------------------------------------------------------------------
; Open the DOS library:
openDOS
lea DOSName(pc),A1
moveq #0,d0
callsys OpenLibrary
move.l D0,_DOSBase
beq noDOS
rts
DOSName DOSNAME
************************************************************************
DATA
************************************************************************
VerRev dc.w 33,1
_SysBase dc.l 0
_DOSBase dc.l 0
_errno dc.l 0
_stdin dc.l -1
_stdout dc.l -1
_stderr dc.l -1
initialSP dc.l 0
_WBenchMsg dc.l 0
dosCmdLen dc.l 0
dosCmdBuf dc.l 0
argvArray ds.l 32
argvBuffer ds.b 256